package util;

import Jama.Matrix;

/**
 *
 * Class description goes here.
 *
 * @author Kamil Gajowy
 */
public final class LagrInterpolation {

    //private double kosztJed;
    
    double[] x = {0.0, 10000.0, 20000.0, 30000.0, 40000.0, 50000.0, 60000.0, 70000.0, 80000.0, 90000.0, 100000.0,
                            110000.0 , 120000.0, 130000.0, 140000.0, 150000.0, 160000.0, 170000.0, 180000.0, 190000.0, 200000.0,
                            210000.0 , 220000.0, 230000.0, 240000.0, 250000.0, 260000.0, 270000.0, 280000.0, 290000.0, 300000.0,
                            310000.0 , 320000.0, 330000.0, 340000.0, 350000.0, 360000.0, 370000.0, 380000.0, 390000.0, 400000.0 };
    
    double[][] y = {{0.0}, {-0.13}, {-0.24}, {-0.32}, {-0.38}, {-0.41}, {-0.42}, {-0.42}, {-0.40}, {-0.37}, {-0.32},
                                {-0.26}, {-0.20}, {-0.12}, {-0.04}, {0.04}, {0.13}, {0.22}, {0.32}, {0.42}, {0.51},
                                {0.61}, {0.70}, {0.79}, {0.88}, {0.97}, {1.05}, {1.14}, {1.21}, {1.29}, {1.36},
                                {1.42}, {1.48}, {1.54}, {1.60}, {1.65}, {1.71}, {1.76}, {1.81}, {1.86}, {1.91} };
        
    double[] x2 = {1.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0};
    double[][] y2 = {{7.35}, {7.94}, {8.47}, {8.86}, {9.17}, {9.44}, {9.78}, {10.18}, {10.85}, {11.9}, {13.47} };

    Matrix a;
    Matrix b;

    /**
    * Default constructor.
     * @param ilosc
     * @param jakosc
     */
    public LagrInterpolation(int ilosc, double jakosc){
        System.out.println("Interpolating ...");
        a = interpolacjaWielomianowa(x2,y2);
        b = interpolacjaWielomianowa(x,y);
        System.out.println("\tdone!");
        //double amount = -7.22*(double)ilosc;       
    }

    private double liczWolumen(double asd){
        double wolumen = 0;

        for(int i = 0; i < x.length;i++){
           wolumen += b.get(i,0)*Math.pow(asd, i);
        }

        return wolumen;
    }

    private double liczJakosc(double asd){
        double jakosc = 0;
  
        for(int i = 0; i < x2.length;i++){
           jakosc += a.get(i,0)*Math.pow(asd, i);
        }

        return jakosc;
    }


    public Matrix interpolacjaWielomianowa(double[] x, double[][] y){

        int n = x.length;
        Matrix A = new Matrix(n,n);
        for(int i =0; i< n; i++) {
            for (int j = 0; j < n; j++) {
                A.set(i, j, Math.pow(x[i], j));
            }
        }
                // rozwiązanie układu, wspolczynniki - macierz nx1
        Matrix c = A.solve(new Matrix(y));
        return c;
    }

   public double getKosztJed(int ilosc, double jakosc) {
       //countLagrInter(ilosc, jakosc);
       //System.out.print(".");
       return liczJakosc(jakosc) + liczWolumen(ilosc);
    }



    /*
    public void countLagrInter(int ilosc, double jakosc){
        this.kosztJed = 5.41 + 2*0.000001*ilosc + 0.0021*Math.pow(jakosc, 2) - 0.2349*jakosc + 10.51;
    }
    /**
     * @return the kosztJed
     *
    public double getKosztJed() {
        return kosztJed;
    }

    public double getKosztJed(int ilosc, double jakosc) {
       countLagrInter(ilosc, jakosc);
       return 5.41 + 2*0.000001*ilosc + 0.0021*Math.pow(jakosc, 2) - 0.2349*jakosc + 10.51;
    }*/


}//end class
